#pragma once
#include <iostream>
#include <cstdio>
#include <cstdarg>
#include <ctime>
#include <string>

// 日志是有日志级别的，不同的级别代表不同的响应方式
#define DEBUG   0
#define NORMAL  1
#define WARNING 2
#define ERROR   3
#define FATAL   4

const char *gLevelMap[] = {
    "DEBUG",
    "NORMAL",
    "WARNING",
    "ERROR",
    "FATAL"
};

#define LOGFILE "LOG.log"

// 完整的日志功能，至少: 日志等级 时间 支持用户自定义(日志内容, 文件行，文件名)
void logMessage(int level, const char *format, ...)
{

//条件编译
#ifndef DEBUG_SHOW
    if(level== DEBUG) return;
#endif

    //输出日志的标准部分
    char stdBuffer[1024]; 
    time_t timestamp = time(nullptr);
    snprintf(stdBuffer, sizeof stdBuffer, "[%s] [%ld] ", gLevelMap[level], timestamp);

    //输出日志的自定义部分
    char logBuffer[1024]; 
    //提取可变参数，定义va_list对象，va_list就是一个char*类型的指针
    va_list args;
    va_start(args, format); //根据最后一个参数进行初始化
    // args格式化到字符串中
    vsnprintf(logBuffer, sizeof logBuffer, format, args);
    //让指针设为空
    va_end(args);

    //打印日志
    FILE *fp = fopen(LOGFILE, "a");
    fprintf(fp, "%s%s\n", stdBuffer, logBuffer);
    //关闭文件
    fclose(fp);
}